package com.edu.dsai.controller;
import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.stp.SaTokenInfo;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.bean.BeanUtil;
import com.edu.dsai.constants.ResultConstants;
import com.edu.dsai.domain.User;
import com.edu.dsai.dto.LoginInput;
import com.edu.dsai.dto.LoginOutput;
import com.edu.dsai.service.UserService;
import com.edu.dsai.utils.R;
import com.edu.dsai.vo.UserVO;
import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController /*告诉Spring此类为Controller*/
@RequestMapping("/user")
public class UserController {
    /*让UserController‘认识’UserService*/
    @Resource
    private UserService userService;
    @RequestMapping("/hw")
    public String test() {
        return "Hello World!";
    }
//    @RequestMapping("/login")
//    public UserVO login(String username, String password) throws Exception {
//        // 服务端对收到的用户名进行验证，不能为null，不能为空串
//        if (username.equals(null) || username.equals("")) {
//            throw new Exception("请输入用户名");
//        }
//        // 服务端对收到的密码进行验证，不能为null，不能为空串
//        if (password.equals(null) || password.equals("")) {
//            throw new Exception("请输入密码");
//        }
//        // 用户名和密码数据是合法的，将数据传给service
//        User user = userService.login(username, password);
//        if (user == null) {
//            throw new Exception("用户名和密码错误");
//        }
//        UserVO userVO = new UserVO();
//        userVO.setId(user.getId());
//        userVO.setUserName(user.getUserName());
//        userVO.setRealName(user.getRealName());
//        userVO.setEmail(user.getEmail());
//        return userVO;
//    }
        @RequestMapping("/login")
    public R<LoginOutput> login(@RequestBody @Validated LoginInput input) throws Exception {
        // 服务端对收到的用户名进行验证，不能为null，不能为空串
        User user = userService.login(input.getUsername(), input.getPassword());
        // 服务端对收到的密码进行验证，不能为null，不能为空串
        if (user == null) {
            return R.failed("用户名和密码错误！");
        }

            // 让sa-token生成用户的登录令牌信息等等
       StpUtil.login(input.getUsername());
            // 获取用户的登录token信息
       SaTokenInfo tokenInfo = StpUtil.getTokenInfo();
        //以下代码使用hutools工具进行简化
       LoginOutput loginOutput = BeanUtil.toBean(user, LoginOutput.class);
       loginOutput.setSaTokenInfo(tokenInfo);
       return R.ok("登录成功了！", loginOutput);
    }
    @GetMapping("/get_data")
    @SaCheckLogin
    public String getData() {
        return "这是get_data方法";
    }
    @GetMapping("/logout")
    @SaCheckLogin
    public void logout() {
        Object loginId = StpUtil.getLoginId();
        StpUtil.logout(loginId);
    }

    @GetMapping("/check-login")
    @SaCheckLogin
    public R<SaTokenInfo> isLogin() {
        boolean isLogin = StpUtil.isLogin();
        if (isLogin == false) {
            return R.failed(ResultConstants.NOT_LOGIN_EXCEPTION);
        }
        SaTokenInfo tokenInfo = StpUtil.getTokenInfo();
        return R.ok(tokenInfo);
    }
}
